package 字符串;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 会玩的洋洋
 * https://leetcode-cn.com/problems/roman-to-integer/
 */
public class _13_罗马数字转整数 {
    /**
     * 声明目标集合  通过hash来存取值
     */
    Map<Character, Integer> map = new HashMap<Character, Integer>() {{
        put('I', 1);
        put('V', 5);
        put('X', 10);
        put('L', 50);
        put('C', 100);
        put('D', 500);
        put('M', 1000);
    }};

    /**
     * 模拟算法  将罗马字符通过hash存储 并声明对应的int值 遍历取出即可
     * @param s 目标字符串
     * @return int
     */
    public int romanToIntByMap(String s) {
        int ret = 0;
        int n = s.length();
        for (int i = 0; i < n; i++) {
            Integer value = map.get(s.charAt(i));
            if (i < n - 1 && value < map.get(s.charAt(i + 1))) {
                ret -= value;
            } else {
                ret += value;
            }
        }
        return ret;
    }

    /**
     * 通过switch来代替hash存储
     * 效率更高
     * @param s 目标字符串
     * @return int
     */
    public int romanToInt(String s) {
        int ret = 0;
        int n = s.length();
        for (int i = 0; i < n; i++) {
            int value = getInt(s.charAt(i));
            if (i < n - 1 && value < getInt(s.charAt(i + 1))) {
                ret -= value;
            } else {
                ret += value;
            }
        }
        return ret;
    }

    /**
     * 通过switch 将 罗马数字转换成整数 并返回
     * @param roman 目标罗马数字
     * @return int
     */
    public int getInt(Character roman) {
        switch (roman) {
            case 'I':
                return 1;
            case 'V':
                return 5;
            case 'X':
                return 10;
            case 'L':
                return 50;
            case 'C':
                return 100;
            case 'D':
                return 500;
            case 'M':
                return 1000;
            default:
                return 0;
        }
    }
}
